perm filename TTYIO.MAC[11,HE] blob
sn#554606 filedate 1981-01-01 generic text, type T, neo UTF8
.TITLE TTY I/O TEST PROGRAM
.MCALL ALUN$S,GLUN$S,QIOW$S,EXIT$S,GREG$S
.BLKW 100 ;Make some stack space
SPSTRT:
REGBUF: .BLKW 3 ;To stick region info into
TSTMRK: .WORD 123456,123123 ;To test we got right UNIBUS address
RDSTS: .WORD 0 ;Read status block
RDCNT: .WORD 0
WRSTS: .WORD 0,0 ;Write status block
STATBF: .BYTE TC.SCP ;Ask if CRT
CRTP: .BYTE 0
NUMBUF: .BLKB 12.
BUFFER: .BLKB 82.
PROMPT: .ASCII /(0):/
HIMES: .ASCII /TTY IO TEST PROGRAM/
HISIZE = .-HIMES
ECHMES: .ASCII /NOW DO SOME TTY ECHOING:/
ECHSIZ = .-ECHMES
YESCRT: .ASCII /WE ARE A CRT/
YCRTSZ = .-YESCRT
NOTCRT: .ASCII /WE ARE NOT A CRT/
NCRTSZ = .-NOTCRT
ADRMES: .ASCII /BASE ADDRESS OF TASK REGION (*100) & LOCAL OFFSET/
ADRSIZ = .-ADRMES
BYEMES: .ASCII <15><12>/THAT'S ALL FOR NOW/
.ASCII <15><12>/How well did we do?/
.ASCII <15><12>/So long sucker./<15><12>
BYESIZ = .-BYEMES
.EVEN
START: MOV #SPSTRT,SP ;Set up stack???
ALUN$S #1,#"TI,#0 ;LUN 1 is TI: device
BCC 10$
JMP ERROR ;Punt if error
10$: QIOW$S #IO.ATT,#1,#1 ;Attach it
BCC 11$
JMP ERROR ;Punt if error
11$: QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#HIMES,#HISIZE,#40> ;Say Hello
BCC 12$
JMP ERROR ;Punt if error
12$: QIOW$S #SF.GMC,#1,#1,,,,<#STATBF,#2> ;See what sort of a tty we are
BCC 13$
JMP ERROR ;Punt if error
13$: MOV #YESCRT,R0 ;Assume we are a CRT
MOV #YCRTSZ,R1
TSTB CRTP ;Now see what we really are
BNE 1$ ;Yes we are a CRT
MOV #NOTCRT,R0 ;No we aren't
MOV #NCRTSZ,R1
1$: QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<R0,R1,#60> ;Say what we are
BCC 16$
JMP ERROR ;Punt if error
16$: CLR R1 ;Count a little
2$: JSR PC,OUTNUM ;Print number out
INC R1
CMP R1,#20
BLE 2$
MOV #123456,R1 ;And one big one
JSR PC,OUTNUM ;Print it out
QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#ADRMES,#ADRSIZ,#60> ;Type address info
BCC 17$
JMP ERROR ;Punt if error
17$: GREG$S ,#REGBUF ;Get region base address
BCC 18$
JMP ERROR
18$: MOV REGBUF,R1
JSR PC,OUTNUM ;Print it out
MOV #TSTMRK,R1 ;Give local address of test data
JSR PC,OUTNUM ;Print it out
QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#ECHMES,#ECHSIZ,#60> ;Say we'll echo now
BCC 14$
JMP ERROR ;Punt if error
14$: MOVB #60,PROMPT+1 ;Reset prompt counter
3$: QIOW$S #IO.RPR,#1,#1,,#RDSTS,,<#BUFFER,#80.,,#PROMPT,#4,#44> ;Get a line
BCC 15$
JMP ERROR ;Punt if error
15$: MOV RDCNT,R1 ;See how many characters were typed
JSR PC,OUTNUM
QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#BUFFER,R1,#40> ;Echo the line back
BCS ERROR ;Punt if error
INCB PROMPT+1 ;Update prompt counter
CMPB #71,PROMPT+1 ;More to do?
BGE 3$ ;Yup - keep going
QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#BYEMES,#BYESIZ,#0> ;Say good bye
BCS ERROR ;Punt if error
EXIT$S ERROR ;Go away
JMP START ;?????
ERROR: IOT ;Crash if any errors
;Auxiliary routine to print out the octal number in R1
OUTNUM: MOV R0,-(SP) ;We need some free registers
MOV R1,-(SP)
MOV R2,-(SP)
MOV R3,-(SP)
MOV #NUMBUF,R2 ;Where we'll stick the result
CLR R0
MOV #6,R3 ;6 digits to print
ASHC #1,R0 ;Get high order digit
1$: TST R0 ;Don't print leading zeros
BNE 2$ ;Found highest order non-zero digit
ASHC #3,R0 ;Try next
SOB R3,1$
INC R3
2$: ADD #60,R0 ;Convert to ASCII
MOVB R0,(R2)+ ;Stick it in buffer
CLR R0
ASHC #3,R0 ;Move on to next digit
SOB R3,2$ ;Do them all
SUB #NUMBUF,R2 ;Get character count for writing
QIOW$S #IO.WLB,#1,#1,,#WRSTS,,<#NUMBUF,R2,#40> ;Type it out
BCS ERROR ;Punt if error
MOV (SP)+,R3 ;Restore registers
MOV (SP)+,R2
MOV (SP)+,R1
MOV (SP)+,R0
RTS PC
.END START